// 重写数组中的部分方法
// 获取数组的原型
const oldArrayProto = Array.prototype;
// 拷贝一份数组方法,不要影响原来的
export const newArrayProto = Object.create(oldArrayProto);
// 要重写的方法合集
const methods = ['push', 'pop', 'shift', 'unshift', 'sort', 'splice', 'reverse'];
methods.forEach(method => {
  newArrayProto[method] = function (...args) {
    // 调用原来的数组方法,this指向arr,arr.push()
    const res = oldArrayProto[method].call(this, ...args);
    // 对新增的数组再次进行劫持
    let inserted;
    let ob = this.__ob__;
    switch (method) {
      case 'push':
      case 'unshift':
        inserted = args;
        break;
      case 'splice':
        // splice从第三个参数开始是新增内容
        inserted = args.slice(2);
        break;
      default:
        break;
    }
    // 对新增内容再次观测,inserted是个数组
    if (inserted) {
      ob.observeArray(inserted);
    }
    // 数组变化了通知更新
    ob.dep.notify();
    return res;
  }
})